﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Core.Data
{
    /// <summary>
    /// 标签管理类
    /// </summary>
    public static class TermManager
    {
        private static Wedn.Interface.DAL.ITerm dao;

        ///// <summary>
        ///// 静态标签列表
        ///// </summary>
        //private static List<Term> tags;
        ///// <summary>
        ///// 标签列表
        ///// </summary>
        //public static List<Term> Tags
        //{
        //    get
        //    {
        //        if (tags == null)
        //        {
        //            LoadStaticTag();
        //        }
        //        return tags;
        //    }
        //}
        //private static object lockHelper = new object();
        //private static void LoadStaticTag()
        //{
        //    if (tags == null)
        //    {
        //        lock (lockHelper)
        //        {
        //            if (tags == null)
        //            {
        //                tags = dao.SelectTermList("post_tag");
        //            }
        //        }
        //    }
        //}
        ///// <summary>
        ///// 静态类别列表
        ///// </summary>
        //private static List<Term> categorys;
        ///// <summary>
        ///// 静态类别列表
        ///// </summary>
        //public static List<Term> Categorys
        //{
        //    get
        //    {
        //        if (categorys == null)
        //        {
        //            LoadStaticCategory();
        //        }
        //        return categorys;
        //    }
        //}
        //private static void LoadStaticCategory()
        //{
        //    if (tags == null)
        //    {
        //        lock (lockHelper)
        //        {
        //            if (tags == null)
        //            {
        //                tags = dao.SelectTermList("post_category");
        //            }
        //        }
        //    }
        //}
        /// <summary>
        /// 链接管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        static TermManager()
        {
            dao = Wedn.Interface.DAOFactory.CreateTermDAO();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
        }

        /// <summary>
        /// 向标签表中插入一行新的数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="term">要插入的标签对象</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Insert(Term term)
        {
            return dao.Insert(term);
        }

        /// <summary>
        /// 根据标签ID删除对应的标签记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的ID</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Delete(int id)
        {
            return dao.Delete(id);
        }

        /// <summary>
        /// 根据标签ID数组删除对应的标签记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Delete(int[] ids)
        {
            return dao.Delete(ids);
        }

        /// <summary>
        /// 更新一个完整的标签对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="term">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateTerm(Term term)
        {
            return dao.UpdateTerm(term);
        }

        /// <summary>
        /// 更新一个标签常用信息, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">标签ID</param>
        /// <param name="name">更新的名称(不更新则传入null)</param>
        /// <param name="slug">更新的别名(不更新则传入null)</param>
        /// <param name="parentId">更新的父ID(不更新则传入-1)</param>
        /// <param name="description">更新的描述(不更新则传入null)</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateInfo(int id, string name, string slug, int parentId, string description)
        {
            return dao.UpdateInfo(id, name, slug, parentId, description);
        }

        /// <summary>
        /// 批量更新标签父ID
        /// </summary>
        /// <param name="ids">标签ID数组</param>
        /// <param name="parentId">更新的父ID</param>
        /// <returns></returns>
        public static int UpdateParentId(int[] ids, int parentId)
        {
            return dao.UpdateParentId(ids, parentId);
        }

        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public static int GetMaxId()
        {
            return dao.SelectMaxId();
        }

        /// <summary>
        /// 检查表中是否已经存在该别名, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="slug">要确定的别名</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        public static bool ExistsSlug(string slug)
        {
            return dao.Exists(slug);
        }

        /// <summary>
        /// 选取标签总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null或空值)(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        public static int GetTermsCount(string where)
        {
            return dao.SelectTermsCount(where);
        }

        /// <summary>
        /// 根据类型选取标签总数
        /// </summary>
        /// <returns>总数</returns>
        public static int GetTermsCountByType(string termType)
        {
            return dao.SelectTermsCountByType(termType);
        }

        /// <summary>
        /// 取出当前标签表中的所有标签对象集合, 返回标签对象集合
        /// </summary>
        /// <returns>标签对象集合</returns>
        public static List<Term> GetTermList()
        {
            return dao.SelectTermList();
        }

        /// <summary>
        /// 根据类型选取标签对象集合, 不存在则返回null
        /// </summary>
        /// <param name="termType">标签类型</param>
        /// <returns>标签对象</returns>
        public static List<Term> GetTermList(string termType)
        {
            return dao.SelectTermList(termType);
        }

        /// <summary>
        /// 根据类型和父ID选取标签对象集合, 不存在则返回null
        /// </summary>
        /// <param name="termType">标签类型</param>
        /// <param name="parentId">父ID</param>
        /// <returns>标签对象</returns>
        public static List<Term> GetTermList(string termType, int parentId)
        {
            return dao.SelectTermList(termType, parentId);
        }

        /// <summary>
        /// 根据对象ID和类型选取标签对象集合, 不存在则返回null
        /// </summary>
        /// <param name="objectId">对象ID</param>
        /// <param name="objectType">对象类型</param>
        /// <returns>标签对象</returns>
        public static List<Term> GetTermList(int objectId, string objectType)
        {
            return dao.SelectTermList(objectId, objectType);
        }

        /// <summary>
        /// 根据ID选取标签对象, 不存在则返回null
        /// </summary>
        /// <param name="termid">标签ID</param>
        /// <returns>标签对象</returns>
        public static Term GetTerm(int termid)
        {
            return dao.SelectTerm(termid);
        }

        /// <summary>
        /// 根据ID和类型选取标签对象, 不存在则返回null
        /// </summary>
        /// <param name="slug">标签别名</param>
        /// <returns>标签对象</returns>
        public static Term GetTerm(string slug)
        {
            return dao.SelectTerm(slug);
        }
    }
}
